package com.its.us.netty.server.code;

import com.its.us.netty.server.handler.WebManySocketHandler;
import com.its.us.netty.server.handler.WebOneSocketHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;

/**
 * String 类型的出站编码器和入站解码器
 *
 * @Author: master
 * @Date: 2020/11/1 19:22
 * @Version: 1.0
 */
public class WebSocketDecAndEncInitializer extends ChannelInitializer<SocketChannel> {

    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        // websocket协议本身是基于http协议的，所以这边也要使用http解编码器
        ch.pipeline().addLast(new HttpServerCodec());
        // 以块的方式来写的处理器
        ch.pipeline().addLast(new ChunkedWriteHandler());
        ch.pipeline().addLast(new HttpObjectAggregator(1024 * 10));
        /**
         * IdleStateHandler 是netty 提供的处理空闲状态处理器
         * readerIdleTime 表示多长时间没有读，发一个心跳包
         * writerIdleTime 表示多长时间没有写，发一个心跳包
         * allIdleTime 表示多长时间既没有读也没有写会，发一个心跳包
         */
        //ch.pipeline().addLast(new IdleStateHandler(3, 5, 7, TimeUnit.SECONDS));
        ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws", "WebSocket", true, 65536 * 10));
        // 群聊
        //ch.pipeline().addLast(new WebManySocketHandler());
        // 单聊
        ch.pipeline().addLast(new WebOneSocketHandler());
    }
}
